자연키 vs 인조키
Question
PK를 설정할 때 어떤 값을 PK로 설정하는게 좋을까?
또 각각의 방법에 어떤 장단점이 있을까
자연키
실제 데이터 값을 말한다. 예를 들면 아이디가 고유할 경우 아이디를 회원 테이블의 PK로 사용할 수 있다.
장점
- MYSQL의 InnoDB스토리지 엔진의 경우 기본키를 바탕으로 테이블 자체가 클러스터링 인덱스가 되기 때문에 자연키를 기본키로 하면 이 자연키를 위해 따로 인덱스를 구성할 필요가 없다.
- 커버링 인덱스가 작용할 가능성이 높다.
- 실제 데이터 값은 그 자체로 의미를 지니므로 PK값에도 의미를 부여한다.
단점
- 해당 데이터 값을 변경하기 어려워 진다.
예를 들어 로그인 ID값을 PK로 설정하면 로그인ID 변경에 있어서 많은 후처리가 필요해진다(참조된 테이블 수정 등) - 자연키가 길거나 복잡할 수 있어, 이로인한 인덱스 및 관련 쿼리의 성능이 저하될 수 있다.
- 비즈니스 요구사항의 변화로 인해 기본키로 사용하던 자연키를 변경해야할 수 있다.
ex) 주민번호를 기본키로 사용했는데 주민번호를 저장하지 못할경우. - 자연키의 고유성을 보장해주기 위한 별도의 장치가 필요하다.
인조키
값 그 자체로 의미 있는 값이 아닌 PK로의 역활을 위해 인위적으로 생성해낸 키를 말한다.
DB의 auto increment 혹은 UUID 등이 있다.
장점
- 비즈니스 요구사항 변화에 전혀 영향받지 않기 때문에 변경할 일이 없다.
단점
- 인덱스를 추가로 구성해주어야 할 수 있다.
- 인조키를 위한 별도의 필드가 추가되어 테이블이 커진다.
결론
자연키를 사용함으로써의 장점도 분명히 있지만, 대부분의 경우에서 인조키로 대체하는 것이 추후 DB설계 변경에과 규모 확장성에 있어서 좋다고 생각한다.
=> 인조키를 사용하자